package modelo.bd;

import java.sql.*;
import java.util.Properties;
import modelo.io.ManejadorArchivos;

public class StoredProcedure {

    private String nombreArchivo;
    private String nombre;
    private int numeroParametros;
    private CallableStatement cstmt;
    private Connection con;
    private Properties config;

    public StoredProcedure(String nombre, int numP) {
        this.nombreArchivo = "../jdbc.properties";
        this.nombre = nombre;
        this.numeroParametros = numP;
    }

    public void crearSP() throws SQLException, ClassNotFoundException, Exception {
        this.crearConexion();
        String sql = "{call " + nombre + "(";
        for (int i = 0; i < this.numeroParametros; i++) {
            sql += "?" + ((i + 1) == this.numeroParametros ? "" : ",");
        }
        sql += ")}";
        this.cstmt = con.prepareCall(sql);
    }

    public void ejecutar() throws SQLException {
        try {
            cstmt.execute();
        } catch (SQLException ex) {
            cerrar();
            throw new SQLException(ex);
        }
    }

    public Object getResultado(int posicion, int tipo) throws SQLException {
        return cstmt.getInt(posicion);
    }

    public Object getResultado(int posicion, String tipo) throws SQLException {
        return cstmt.getString(posicion);
    }

    public Object getResultado(int posicion, double tipo) throws SQLException {
        return cstmt.getDouble(posicion);
    }

    public void parametroIN(int posicion, boolean valor) throws SQLException {
        cstmt.setBoolean(posicion, valor);
    }

//    public void parametroIN(int posicion, char valor) throws SQLException {
//    }
    public void parametroIN(int posicion, String valor) throws SQLException {
        cstmt.setString(posicion, valor);
    }

    public void parametroIN(int posicion, int valor) throws SQLException {
        cstmt.setInt(posicion, valor);
    }

    public void parametroIN(int posicion, long valor) throws SQLException {
    }

    public void parametroIN(int posicion, float valor) throws SQLException {
        cstmt.setFloat(posicion, valor);
    }

    public void parametroIN(int posicion, double valor) throws SQLException {
        cstmt.setDouble(posicion, valor);
    }

    public void parametroOUT(int posicion, boolean valor) throws SQLException {
        cstmt.registerOutParameter(posicion, Types.SMALLINT);
    }

    public void parametroOUT(int posicion, char valor) throws SQLException {
        cstmt.registerOutParameter(posicion, Types.CHAR);
    }

    public void parametroOUT(int posicion, String valor) throws SQLException {
        cstmt.registerOutParameter(posicion, Types.VARCHAR);
    }

    public void parametroOUT(int posicion, int valor) throws SQLException {
        cstmt.registerOutParameter(posicion, Types.INTEGER);
    }

    public void parametroOUT(int posicion, long valor) throws SQLException {
        cstmt.registerOutParameter(posicion, Types.DECIMAL);
    }

    public void parametroOUT(int posicion, float valor) throws SQLException {
        cstmt.registerOutParameter(posicion, Types.FLOAT);
    }

    public void parametroOUT(int posicion, double valor) throws SQLException {
        cstmt.registerOutParameter(posicion, Types.DOUBLE);
    }

    private void crearConexion() throws ClassNotFoundException, SQLException, Exception{
        this.config = ManejadorArchivos.instancia().obtenerArchivoPropiedades(nombreArchivo);
        Class.forName(config.getProperty("bd_driver"));
        con = DriverManager.getConnection(config.getProperty("bd_url"),
                config.getProperty("bd_usuario"), config.getProperty("bd_contrasena"));
    }

    public void cerrar() throws SQLException {
        try {
            cstmt.close();
            con.close();
        } catch (SQLException ex) {
            throw new SQLException(ex);
        }
    }
}
